/**
 * 和call、apply之间的区别是， 里面返回一个函数， 函数的参数是两个参数的总和
 */

Function.prototype.myBind = (context, args) => {
    context = context || window
    const symbol = Symbol('fn')
    context[symbol] = this

    // 这里面就使用到了闭包的原理， 函数内部可以访问到函数外部的变量，不用放在全局变量里面， 污染全局环境
    return function (_arg) {
        const finArgs = [...args, ..._arg]
        context[symbol](finArgs)
        // 删除掉， 防止污染
        delete context[symbol]
    }
}


Function.prototype.myBIndV2 = (context, args) => {
    // 1。 作用域
    // 2， 声明一个唯一的属性作为this
    // 3。 结合两个参数， 然后传进去就可以了
    context = context || window
    const symbol = Symbol('fn')
    context[symbol] = this

    // 这里就是使用了闭包的形式， 就是结合两个两个参数， 然后调用即可
    return function (_args) {
        const finArgs = [...args, ..._args]
        context[symbol](finArgs)

        delete context[symbol]
    }
}


function myBindV2(context, args) {
    context = context || window
    const symbol = Symbol('cn')
    context[symbol] = this;
    return function (_args) {
        context[symbol]([...args, ..._args])
        delete context[symbol]
    }
}


Function.prototype._bind=(context=window)=>{
    const arg=[...arguments].slice(1)

    context.fn=this;
    return function (_args){
        context.fn([...arg,..._args])
        delete context.fn;
    }
}

const sum =()=>{}
const sumObj={
    sub:(num)=>{
        console.log('sub',num)
    }
}

sumObj.sub._bind(sum,10)
